<?php
/**
 * セッション制御クラスモジュール
 */

/**
 * セッション制御クラス
 * @link https://www.evernote.com/view/d705e9a6-493b-4208-b644-139f553adac1?locale=ja#n=d705e9a6-493b-4208-b644-139f553adac1
 */
 class Lib_Session
 {
 	/** コンソール起動フラグ */
 	protected $_bConsole;
 	/** セッション階層名 */
 	protected $_structureKey = '';

 	public static  $_ConsoleSessionBuff;

 	/**
 	 * コンストラクタ
 	 * @param $structureKey 取り扱いセッションを階層管理したい場合設置
 	 */
 	public function __construct($structureKey='')
 	{
 		$this->_structureKey = $structureKey;
 		/***
 		 * シンプルテスト起動の場合、テキストファイルからセッション情報を読み込む
 		 */
 		$this->_bConsole = FALSE;

 		/*** シンプルテスト起動判定 */
 		if (defined('SIMPLETEST_PRELOAD')){
  				$this->_bConsole = TRUE;
 				$filename = COMPILE_DIR . '/SESSION.txt';
 				/*** セッションファイル存在判定 */
 				if (file_exists($filename)){
	 				$sSerial = file_get_contents($filename);
 				} else {
 					$sSerial = '';
 				}
 				self::$_ConsoleSessionBuff = unserialize($sSerial);
 				return;
 		}

 		/**
 		 * 通常セッション処理
 		 */
 		if (!isset($_SESSION)){
 			session_start();
 		}
 	}

 	public function __destruct()
 	{
 		/**
 		 * コンソール起動の場合、テキストファイルとしてセッションを保存する
 		 */
 		if ($this->_bConsole == TRUE){
 			$sSerial = serialize(self::$_ConsoleSessionBuff);
 			$FileName = COMPILE_DIR . '/SESSION.txt';
 			file_put_contents($FileName, $sSerial);
 		}
 	}

 	/**
 	 * セッションバリュー取得
 	 * @param $key ハッシュキー
 	 */
 	public function getValue($key)
 	{
 		/***
 		 * コンソール軌道の場合内部バッファを返す
 		 */
 		$sValue = '';
 		/*** コンソール起動判定 */
 		if ($this->_bConsole == TRUE){
 			/** 階層管理キー有無判定 */
 			if ($this->_structureKey == ''){
 				/*** 指定キー存在判定 */
	 			if (isset(self::$_ConsoleSessionBuff[$key])){
 					$sValue = self::$_ConsoleSessionBuff[$key];
 				}
 			}else{
 			/*** 階層管理キー有り */
 				if (isset(self::$_ConsoleSessionBuff[$this->_structureKey][$key])){
 					$sValue = self::$_ConsoleSessionBuff[$this->_structureKey][$key];
 				}
 			}
 			return $sValue;
 		}

 		/***
 		 * 通常セッション処理
 		 */
 		if ( !isset($_SESSION)) {
 			session_start();
 		}
 		if ( $this->_structureKey == '' ) {
	 		if ( isset($_SESSION[$key]))
	 		{
	 			$sValue = $_SESSION[$key];
	 		}
 		}else{
 			if ( isset($_SESSION[$this->_structureKey][$key]) ) {
 				$sValue = $_SESSION[$this->_structureKey][$key];
 			}
 		}
 		return $sValue;
 	}

 	/**
 	 * セッションバリュー設定
 	 * @param $key ハッシュキー
 	 * @param $value 設定値
 	 */
 	public function setValue($key, $value){
 		/**
 		 * コンソール起動の場合、内部バッファに保存する
 		 */
 		if ($this->_bConsole == TRUE) {
 			if ($this->_structureKey == '') {
	 			self::$_ConsoleSessionBuff[$key] = $value;
 			} else {
 				self::$_ConsoleSessionBuff[$this->_structureKey][$key] = $value;
 			}
 			return;
 		}

 		/**
 		 * 通常セッション処理
 		 */
 		if ( !isset($_SESSION)){
 			session_start();
 		}
 		if ($this->_structureKey == '') {
	 		if (isset($_SESSION[$key])){
	 			unset($_SESSION[$key]);
	 		}
	 		$_SESSION[$key] = $value;
 		}else{
 			if (isset($_SESSION[$this->_structureKey][$key])){
 				unset($_SESSION[$this->_structureKey][$key]);
 			}
 			$_SESSION[$this->_structureKey][$key] = $value;
 		}
 	}

 	/**
 	 * セッションキーを削除する
 	 * @param unknown_type $key
 	 */
 	public function clear($key='')
 	{
 		/**
 		 * コンソール起動の場合、内部バッファからキーを削除する
 		 */
 		if ($this->_bConsole == TRUE) {
 			if ($this->_structureKey == '') {
 				if ($key != '') {
 					if (isset(self::$_ConsoleSessionBuff[$key])) {
	 					unset(self::$_ConsoleSessionBuff[$key]);
 					}
 				}
 			} else {
 				if ($key != '') {
 					if (isset(self::$_ConsoleSessionBuff[$this->_structureKey][$key])) {
		 				unset(self::$_ConsoleSessionBuff[$this->_structureKey][$key]);
 					}
 				} else {
 					if (isset(self::$_ConsoleSessionBuff[$this->_structureKey])) {
	 					unset(self::$_ConsoleSessionBuff[$this->_structureKey]);
 					}
 				}
 			}
 			return;
 		}

 		/***
 		 * 通常セッション処理
 		 */
 		if ($this->_structureKey == '') {
 			if ($key == '') {
 				session_destroy();
 			} else {
 				if (isset($_SESSION[$key])) {
 					unset($_SESSION[$key]);
 				}
 			}
 		} else {
 			if ($key == '') {
 				if (isset($_SESSION[$this->_structureKey])) {
 					unset($_SESSION[$this->_structureKey]);
 				}
 			} else {
 				if (isset($_SESSION[$this->_structureKey][$key])) {
 					unset($_SESSION[$this->_structureKey][$key]);
 				}
 			}
 		}
 	}
 }